package cn.hackcloud.demo.dubbo;

import java.io.IOException;
import java.util.Collections;

import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.ImportResource;

/**
 * 1、导入依赖；
 * 		1）、导入dubbo-starter
 * 		2）、导入dubbo的其他依赖
 * @author lfy
 *
 * SpringBoot与dubbo整合的三种方式：
 * 1）、导入dubbo-starter，在application.properties配置属性，使用@Service【暴露服务】使用@Reference【引用服务】
 * 2）、保留dubbo xml配置文件;
 * 		导入dubbo-starter，使用@ImportResource导入dubbo的配置文件即可
 * 3）、使用注解API的方式：
 * 		将每一个组件手动创建到容器中,让dubbo来扫描其他的组件
 */
@EnableDubbo //开启基于注解的dubbo功能
@ImportResource(locations="classpath:dubbo.xml")
@EnableHystrix //开启服务容错
@SpringBootApplication
@EnableAspectJAutoProxy
public class ProviderApplication {

	public static void main(String[] args) {
		//initFlowRule();
		SpringApplication.run(ProviderApplication.class, args);
		try {
			System.in.read();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	private static void initFlowRule() {
		FlowRule flowRule = new FlowRule();
		//针对具体的方法限流
		flowRule.setResource("sentinel");
		flowRule.setCount(10);//限流阈值 qps=10
		flowRule.setGrade(RuleConstant.FLOW_GRADE_THREAD);//限流阈值类型（QPS 或并发线程数）
		flowRule.setLimitApp("default");//流控针对的调用来源，若为 default 则不区分调用来源
		// 流量控制手段（直接拒绝、Warm Up、匀速排队）
		flowRule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
		FlowRuleManager.loadRules(Collections.singletonList(flowRule));
	}
}
